<?php


namespace Extend\facade;

use Predis\Client as PredisClient;
use Extend\facade\Config;

class Predis
{
    private static $facadeClient;
    private static $facadeInstance;
    private static $facadeConfig;

    // 构造函数
    private function __construct() {

    }

    // 析构函数（实例销毁前调用）
    public function __destruct()
    {
        static::facadeClose();
    }

    // 初始化实例
    private static function facadeInitInstance() {
        if (empty(static::$facadeConfig) || !is_array(static::$facadeConfig)) {
            return null;
        }
        // 判断是否已经有了门面客户端
        if (!static::$facadeClient) {
            // 判断是否有了实例(如果不需要析构执行注销代码可不需要实例自己)
            if (!static::$facadeInstance) {
                static::$facadeInstance = new self();
            }
            // 创建 Predis客户端实例
            static::$facadeClient = new PredisClient(static::$facadeConfig);
        }
    }


    // 获取客户端实例
    private static function facadeGetClient()
    {
        if (!static::$facadeClient) {
            if (!static::$facadeConfig) {
                // 默认配置
                if (Config::has('predis')) {
                    if (Config::has('predis.default')) {
                        static::$facadeConfig = Config::get('predis.default');
                    }
                    else {
                        static::$facadeConfig = Config::get('predis');
                    }
                }
            }
            // 加载配置
            static::facadeInit();
        }

        return static::$facadeClient;
    }

    // 手动初始
    public static function facadeInit($config = []) {
        if (!empty($config) && is_array($config)) {
            static::$facadeConfig = $config;
        }
        static::facadeInitInstance();
    }

    // 关闭函数
    public static function facadeClose() {
        if (static::$facadeClient) {
            // 自身不存在的方法就会走 "__callStatic" 魔术方法
            static::disconnect();
        }
    }

    // 魔术方法, 在尝试调用不存在或不可访问的静态方法时被触发，可以在此方法内定义自定义的行为。这个方法通常用于实现静态方法的动态调用和重定向。
    public static function __callStatic($method, $arguments)
    {
        $facadeClient = static::facadeGetClient();

        $result = call_user_func_array([$facadeClient, $method], $arguments);
        // 如果调用的方法是关闭redis则清除实例
        if ($method == 'disconnect') {
            static::$facadeClient = null;
        }
        return $result;
    }
}